'''
    单线程服务器, 不断监听有没有新的client连入, 若键盘输入任意东西则退出程序
'''

import select
import socket
import sys

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('', 7788))
server.listen(5)

# 网络通信和系统的标准输入, 对于Unix系统来说都是文件, select是专门监听文件的
# 这种方式仅仅适合linux, 不能用在windows, winpython的select只支持socket不支持file!
inputs = [server, sys.stdin]    # 此时对于select来说就是监听了2个IO
running = True

while True:
    # 我们只关心可读的事件, 即接收到了新的客户端或者键盘输入 (windows下的selectAPI只能接收socket,键盘输入则不可)
    readable, writeable, excepional = select.select(inputs, [], []) # 这里是阻塞的
    for readThing in readable:
        # 有新的客户端连进来了
        if readThing == server:
            newClient, addr = server.accept()
            inputs.append(newClient)

        # 键盘输入东西了
        elif readThing == sys.stdin:
            cmd = sys.stdin.readline()
            running = False
            break

        # 其他的IO都不要; 记住select只管IO, IO都是可以close的
        else:
            inputs.remove(readThing)
            readThing.close()

    if not running:
        break

# 如果检测到用户输入敲击键盘，那么就退出
server.close()
